Skip to content

gh-143300: implement PyUnstable_SetImmortal#144543

Draft
kumaraditya303 wants to merge 3 commits intopython:mainfrom
kumaraditya303:immortal
Draft

gh-143300: implement PyUnstable_SetImmortal#144543
kumaraditya303 wants to merge 3 commits intopython:mainfrom
kumaraditya303:immortal

Conversation

@kumaraditya303
Copy link
Contributor

@kumaraditya303 kumaraditya303 commented Feb 6, 2026


int
PyUnstable_SetImmortal(PyObject *op)
{
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should there maybe be a call to IsUniquelyReferenced as a sanity check? It won't be foolproof for objects that are transiently shared. However, if the argument isn't uniquely referenced then that's definitely incorrect use of this function.

Copy link
Member

@ZeroIntensity ZeroIntensity left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we also need to document the guarantees regarding which objects may be made immortal. For example, the following results in an assertion failure:

from ctypes import pythonapi, py_object, c_int

set_immortal = pythonapi.PyUnstable_SetImmortal
set_immortal.argtypes = (py_object,)
set_immortal.restype = c_int

print(set_immortal("Hello world"))


.. c:function:: int PyUnstable_SetImmortal(PyObject *op)

Marks the object *op* immortal. The argument should be uniquely referenced by
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Marks the object *op* immortal. The argument should be uniquely referenced by
Marks the object *op* :term:`immortal`. The argument should be uniquely referenced by

Comment on lines +810 to +811
This is a one-way process: objects can only be made immortal, they cannot be
made mortal once again. Immortal objects do not participate in reference counting
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is currently a comma-splice:

Suggested change
This is a one-way process: objects can only be made immortal, they cannot be
made mortal once again. Immortal objects do not participate in reference counting
This is a one-way process: objects can only be made immortal; they cannot be
made mortal once again. Immortal objects do not participate in reference counting

Or alternatively:

Suggested change
This is a one-way process: objects can only be made immortal, they cannot be
made mortal once again. Immortal objects do not participate in reference counting
This is a one-way process. Once an object is made immortal, it cannot be
made mortal once again. Immortal objects do not participate in reference counting

and will never be garbage collected.

This function is intended to be used soon after *op* is created, by the code that
creates it, such as in the object's tp_new slot.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
creates it, such as in the object's tp_new slot.
creates it, such as in the object's :c:member:`~PyTypeObject.tp_new` slot.

Comment on lines +2796 to +2797
assert(op != NULL);
_Py_SetImmortal(op);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this return 0 if op is already immortal?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants